/**
 * 聊天API服务
 * 封装与AI接口的通信
 */

// API配置
const API_CONFIG = {
  baseURL: process.env.VUE_APP_API_BASE_URL || 'http://localhost:8080', // 可通过环境变量配置
  chatEndpoint: '/v1/chat/completions',
  timeout: 60000 // 60秒超时
}

/**
 * 发送聊天请求(流式响应)
 * @param {Object} chatParams - 聊天参数
 * @param {Function} onMessage - 接收到消息片段时的回调
 * @param {Function} onComplete - 流式响应完成时的回调
 * @param {Function} onError - 发生错误时的回调
 * @returns {Object} 包含abort方法的对象,用于取消请求
 */
export function sendChatStream(chatParams, onMessage, onComplete, onError) {
  const controller = new AbortController()
  const signal = controller.signal

  // 构建完整的请求URL
  const url = `${API_CONFIG.baseURL}${API_CONFIG.chatEndpoint}`

  // 添加stream参数
  const requestBody = {
    ...chatParams,
    stream: true
  }

  fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(requestBody),
    signal
  })
    .then(response => {
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`)
      }
      return response.body
    })
    .then(body => {
      const reader = body.getReader()
      const decoder = new TextDecoder('utf-8')
      let buffer = ''

      // 递归读取流数据
      function readStream() {
        reader.read().then(({ done, value }) => {
          if (done) {
            // 流结束
            if (onComplete) {
              onComplete()
            }
            return
          }

          // 解码数据
          buffer += decoder.decode(value, { stream: true })
          
          // 按行分割数据
          const lines = buffer.split('\n')
          
          // 保留最后一个不完整的行
          buffer = lines.pop() || ''

          // 处理每一行数据
          lines.forEach(line => {
            line = line.trim()
            
            // 跳过空行和注释
            if (!line || line.startsWith(':')) {
              return
            }

            // 处理SSE格式数据: data: {...}
            if (line.startsWith('data: ')) {
              const data = line.substring(6).trim()
              
              // 检查是否是结束标记
              if (data === '[DONE]') {
                if (onComplete) {
                  onComplete()
                }
                return
              }

              try {
                // 解析JSON数据
                const parsed = JSON.parse(data)
                
                // 提取消息内容
                if (parsed.choices && parsed.choices.length > 0) {
                  const choice = parsed.choices[0]
                  const content = (choice.delta && choice.delta.content) ? choice.delta.content : ''
                  
                  if (content && onMessage) {
                    onMessage(content)
                  }
                  
                  // 检查是否完成
                  if (choice.finish_reason && onComplete) {
                    onComplete()
                    return
                  }
                }
              } catch (e) {
                console.error('解析流数据失败:', e, '原始数据:', data)
              }
            }
          })

          // 继续读取
          readStream()
        }).catch(error => {
          if (error.name !== 'AbortError') {
            console.error('读取流数据失败:', error)
            if (onError) {
              onError(error)
            }
          }
        })
      }

      readStream()
    })
    .catch(error => {
      if (error.name !== 'AbortError') {
        console.error('请求失败:', error)
        if (onError) {
          onError(error)
        }
      }
    })

  // 返回控制对象
  return {
    abort: () => {
      controller.abort()
    }
  }
}

/**
 * 发送聊天请求(非流式响应)
 * @param {Object} chatParams - 聊天参数
 * @returns {Promise} 返回完整的响应数据
 */
export async function sendChat(chatParams) {
  const url = `${API_CONFIG.baseURL}${API_CONFIG.chatEndpoint}`

  const requestBody = {
    ...chatParams,
    stream: false
  }

  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(requestBody),
      timeout: API_CONFIG.timeout
    })

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }

    const data = await response.json()
    
    // 提取消息内容
    if (data.choices && data.choices.length > 0) {
      const message = data.choices[0].message
      return (message && message.content) ? message.content : ''
    }
    
    return ''
  } catch (error) {
    console.error('请求失败:', error)
    throw error
  }
}


export default {
  sendChatStream,
  sendChat,
}
